#include "tfdataconvert.h"
#include "qdebug.h"

/**
 * 构造函数
 * @brief TFDataConvert::TFDataConvert
 * @param output_tf 输入matlab获取的数据
 * @param maxFShow 最大显示的频域值，高频HF的最大值
 */
TFDataConvert::TFDataConvert(struct9_T output_tf,double maxFShow,bool useLog)
{
    this->output_tf=output_tf;
    this->maxF=maxFShow;
    this->useLog=useLog;
}

/**
 * 获取burg的时频数据
 * @brief TFDataConvert::getBurgData
 * @param t 时间
 * @param f 频率
 * @param psd 频谱数据
 * @param maxv 频谱数据的最大值
 */
QVector<QVector<double>> TFDataConvert::getBurgData(QVector<double> &t, QVector<double> &f,double &maxv,double &minv)
{
    QVector<QVector<double>> T = dc.convertRowMajor(output_tf.ar.t);
    int len_T=T.at(0).size();
    qDebug()<<"len_T="<<len_T;
    for(int i=0;i<len_T;i++)
    {
        t.append(T.at(0).at(i));
    }
    qDebug()<<"maxF="<<maxF;
    QVector<double>F = dc.convertToQVector(output_tf.ar.f);
    int f_endIndex=0;
    int F_len=F.size();
    qDebug()<<"F_len="<<F_len;
    for(int i=0;i<F_len;i++)
    {
        if(F.at(i)<maxF*1.1){
            f.append(F.at(i));
            f_endIndex=i;
        }
    }
    qDebug()<<"f.size="<<f.size();
    QVector<QVector<double>> PSD = dc.convertColsMajor(output_tf.ar.psd);
    qDebug()<<"psd_rows="<<PSD.size()<<"PSD_colms="<<PSD.at(0).size();
    double max=PSD[0][0]/1e6;
    double min=PSD[0][0]/1e6;
    if(useLog){
        max=log(PSD[0][0]/1e6);
        min=log(PSD[0][0]/1e6);
    }
    QVector<QVector<double>>psd(len_T, QVector<double>(f_endIndex+1)); // 所有元素默认初始化为 0
    for (int x=0; x<len_T;  x++){
        for (int y=0; y<f_endIndex+1;  y++){
            if(useLog)
                psd[x][y]=log(PSD[x][y]/1e6);
            else
                psd[x][y]=PSD[x][y]/1e6;
            if(psd[x][y]>max)
                max=psd[x][y];
            if(psd[x][y]<min)
                min=psd[x][y];
        }
    }
    qDebug()<<"maxv="<<max;
    maxv=max;
    minv=min;
    return psd;
}

/**
 * 获取lomb时频数据
 * @brief TFDataConvert::getLSData
 * @param t 时间
 * @param f 频率
 * @param psd 时频数据
 * @param maxv 时频数据的最大值
 */
QVector<QVector<double>> TFDataConvert::getLSData(QVector<double> &t, QVector<double> &f, double &maxv,double &minv)
{

    t = dc.convertToQVector(output_tf.lomb.t);
    int len_T=t.size();
    QVector<QVector<double>> PSD_ls = dc.convertColsMajor(output_tf.lomb.psd);

    QVector<double>F = dc.convertToQVector(output_tf.lomb.f);
    int f_endIndex=0;
    for(int i=0;i<F.size();i++)
    {
        if(F.at(i)<maxF*1.1){
            f.append(F.at(i));
            f_endIndex=i;
        }
    }
    double max=PSD_ls[0][0]/1e6;
    double min=PSD_ls[0][0]/1e6;
    if(useLog){
        max=log(PSD_ls[0][0]/1e6);
        min=log(PSD_ls[0][0]/1e6);
    }
    QVector<QVector<double>>psd(len_T, QVector<double>(f_endIndex+1)); // 所有元素默认初始化为 0
    for (int x=0; x<len_T;  x++){
        for (int y=0; y<f_endIndex+1;  y++){
            if(useLog)
                psd[x][y]=log(PSD_ls[x][y]/1e6);
            else
                psd[x][y]=PSD_ls[x][y]/1e6;
            if(psd[x][y]>max)
                max=psd[x][y];
            if(psd[x][y]<min)
                min=psd[x][y];
        }
    }
    maxv=max;
    minv=min;
    return psd;
}

/**
 * 获取小波的视频数据
 * @brief TFDataConvert::getWaveletData
 * @param t 时间
 * @param f 频率
 * @param psd 时频数据
 * @param maxv 时频数据的最大值
 */
QVector<QVector<double>> TFDataConvert::getWaveletData(QVector<double> &t, QVector<double> &f, double &maxv,double &minv)
{
    QVector<QVector<double>> PSD_wavlet = dc.convertColsMajor(output_tf.wav.psd);
    QVector<QVector<double>>wavlet_t=dc.convertColsMajor(output_tf.wav.t);
    int wavlet_t_len=wavlet_t.size();
    for(int k=0;k<wavlet_t_len;k++)
        t.append(wavlet_t.at(k).at(0));
    for(int k=0;k<449;k++)
        f.append(log2(1.0/output_tf.wav.f[k]));
    double max=PSD_wavlet[0][0]/1e6;
    double min=PSD_wavlet[0][0]/1e6;
    if(useLog){
        max=log(PSD_wavlet[0][0]/1e6);
        min=log(PSD_wavlet[0][0]/1e6);
    }
    QVector<QVector<double>>psd(wavlet_t_len, QVector<double>(449)); // 所有元素默认初始化为 0
    for (int x=0; x<wavlet_t_len; x++){
        for (int y=0; y<449;  y++){
            if(useLog)
                psd[x][y]=log(PSD_wavlet[x][y]/1e6);
            else
                psd[x][y]=PSD_wavlet[x][y]/1e6;
            if(psd[x][y]>max)
                max=psd[x][y];
            if(psd[x][y]<min)
                min=psd[x][y];
        }
    }
    maxv=max;
    minv=min;
    return psd;
}
